#include <bits/stdc++.h>

using namespace std;

const int maxn=1010;
int maze[maxn][maxn];
struct S{short x,y,d;bool s;};
S q[maxn*maxn*4*2];
int step[maxn*maxn*4*2];
//int from[maxn*maxn*4*2];
bool vis[maxn][maxn][4][2];

const int dx[]={-1,0,1,0};
const int dy[]={0,-1,0,1};

int main(){
    int f,r,n,m;

    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&maze[i][j]);

    f=0;
    for(r=0;r<4;r++){
        q[r]=(S){1,1,r,0};
        vis[1][1][r][0]=1;
        step[r]=0;
    }
    for(;f<r;f++){
        const S &cur=q[f];
        if(cur.x==n&&cur.y==m){
            /*int j=f;
            while(j){
                printf("# %d:(%d,%d,%d,%d)\n",j,q[j].x,q[j].y,q[j].d,(int)q[j].s);
                j=from[j];
            }*/
            printf("%d\n",step[f]);
            return 0;
        }
        int x,y;
        x=cur.x+dx[cur.d];
        y=cur.y+dy[cur.d];
        if(maze[x][y]==0) continue;
        else if(maze[x][y]==1){
            for(int d=0;d<4;d++)
                if(!vis[x][y][d][cur.s]) q[r]=(S){x,y,d,cur.s}/*,from[r]=f*/,step[r++]=step[f]+1,vis[x][y][d][cur.s]=1;
        }else if(maze[x][y]==2){
            for(int d=0;d<4;d++)
                if(!vis[x][y][d][1]) q[r]=(S){x,y,d,1}/*,from[r]=f*/,step[r++]=step[f]+1,vis[x][y][d][1]=1;
        }else if(maze[x][y]==3){
            if(cur.s)
                for(int d=0;d<4;d++)
                    if(!vis[x][y][d][cur.s]) q[r]=(S){x,y,d,cur.s}/*,from[r]=f*/,step[r++]=step[f]+1,vis[x][y][d][cur.s]=1;
        }else if(maze[x][y]==4){
            int tx,ty;
            tx=x+dx[cur.d];ty=y+dy[cur.d];
            if(maze[tx][ty]&&maze[tx][ty]!=3){
                if(!vis[x][y][cur.d][0]) q[r]=(S){x,y,cur.d,0}/*,from[r]=f*/,step[r++]=step[f]+1,vis[x][y][cur.d][0]=1;
            }else{
                for(int d=0;d<4;d++)
                    if(!vis[x][y][d][0]) q[r]=(S){x,y,d,0}/*,from[r]=f*/,step[r++]=step[f]+1,vis[x][y][d][0]=1;
            }
        }
    }
    printf("-1\n");
    return 0;
}
